// Strings (字符串) 示例
// 演示 Pascal 中字符串的各种用法
program p_17_strings;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件
uses
  SysUtils;  // 系统工具单元，包含常用的字符串处理函数

// 所有变量声明移到这里
var
  str1: String;
  str2: String;
  str3: String;
  text: String;
  sentence: String;
  trimmed: String;
  message: String;
  part1: String;
  part2: String;
  pos1: Integer;
  modifyText: String;
  words: array[1..5] of String;
  i: Integer;
  sentenceFromWords: String;
  name: String;
  age: Integer;
  score: Real;
  formatted: String;

// 程序主入口
begin
  WriteLn('=== Pascal 字符串示例 ===');
  WriteLn;
  
  // 1. 字符串声明和初始化
  WriteLn('1. 字符串声明和初始化:');
  str1 := 'Hello';
  str2 := 'Pascal';
  str3 := str1 + ' ' + str2 + '!';  // 字符串连接
  
  WriteLn('  str1: ', str1);
  WriteLn('  str2: ', str2);
  WriteLn('  str3: ', str3);
  
  WriteLn;
  
  // 2. 字符串长度和索引访问
  WriteLn('2. 字符串长度和索引访问:');
  text := 'Programming';
  WriteLn('  文本: ', text);
  WriteLn('  长度: ', Length(text));
  WriteLn('  第1个字符: ', text[1]);
  WriteLn('  最后一个字符: ', text[Length(text)]);
  
  // 修改字符串中的字符
  text[1] := 'p';
  WriteLn('  修改后的文本: ', text);
  
  WriteLn;
  
  // 3. 字符串处理函数
  WriteLn('3. 字符串处理函数:');
  sentence := '  Hello, Pascal World!  ';
  WriteLn('  原始句子: ''', sentence, '''');
  WriteLn('  长度: ', Length(sentence));
  
  // 去除空白字符
  trimmed := Trim(sentence);
  WriteLn('  去除两端空白后: ''', trimmed, '''');
  WriteLn('  新长度: ', Length(trimmed));
  
  // 转换大小写
  WriteLn('  大写: ''', UpperCase(trimmed), '''');
  WriteLn('  小写: ''', LowerCase(trimmed), '''');
  
  WriteLn;
  
  // 4. 子串操作
  WriteLn('4. 子串操作:');
  message := 'Welcome to Pascal programming';
  WriteLn('  原始消息: ', message);
  
  // 提取子串
  part1 := Copy(message, 1, 7);  // 从位置1开始复制7个字符
  WriteLn('  前7个字符: ''', part1, '''');
  
  part2 := Copy(message, 9, 2);  // 从位置9开始复制2个字符
  WriteLn('  位置9开始的2个字符: ''', part2, '''');
  
  // 查找子串
  pos1 := Pos('Pascal', message);
  if pos1 > 0 then
    WriteLn('  ''Pascal'' 的位置: ', pos1)
  else
    WriteLn('  未找到 ''Pascal''');
  
  WriteLn;
  
  // 5. 字符串修改操作
  WriteLn('5. 字符串修改操作:');
  modifyText := 'Hello World';
  WriteLn('  原始文本: ', modifyText);
  
  // 插入子串
  Insert(' Beautiful', modifyText, 6);  // 在位置6插入
  WriteLn('  插入后: ', modifyText);
  
  // 删除子串
  Delete(modifyText, 6, 10);  // 从位置6开始删除10个字符
  WriteLn('  删除后: ', modifyText);
  
  WriteLn;
  
  // 6. 字符串数组
  WriteLn('6. 字符串数组:');
  words[1] := 'Pascal';
  words[2] := 'is';
  words[3] := 'a';
  words[4] := 'powerful';
  words[5] := 'language';
  
  Write('  单词数组: ');
  for i := 1 to 5 do
    Write(words[i], ' ');
  WriteLn;
  
  // 连接数组中的所有单词
  sentenceFromWords := '';
  for i := 1 to 5 do
  begin
    sentenceFromWords := sentenceFromWords + words[i];
    if i < 5 then
      sentenceFromWords := sentenceFromWords + ' ';
  end;
  WriteLn('  连接后的句子: ', sentenceFromWords);
  
  WriteLn;
  
  // 7. 字符串格式化
  WriteLn('7. 字符串格式化:');
  name := '张三';
  age := 25;
  score := 95.5;
  
  WriteLn('  姓名: ', name);
  WriteLn('  年龄: ', age);
  WriteLn('  分数: ', score:0:1);
  
  // 格式化输出
  formatted := Format('学生 %s 今年 %d 岁，考试得分 %.1f', [name, age, score]);
  WriteLn('  格式化输出: ', formatted);
  
  WriteLn;
  WriteLn('演示了 Pascal 中字符串的各种用法');
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.